/**
 * 项目名：
 * 包名：com.zhibaicc.android
 * 文件名：Sphelper.java
 * 版本信息：1.0.0
 * 创建日期：2014年5月30日-下午3:14:27
 * 创建人： 单
 * 上海智百文化传播有限公司
 */
package com.sensePlusVR.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.text.TextUtils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.sensePlusVR.bean.CollectFollowIds;

/**
 * @author: Loren
 * @create: 2016-7-4下午8:06:18
 * @desc: 保存数据
 */
@SuppressLint("DefaultLocale")
public class MySharedPreferences {
    private static SharedPreferences sp;
    //有时候需要清除
    private static final String NAME_CLEAR = "MyShare_clear";
    //不需要清除的数据,供外部类调用（例如用户名，手势密码等信息）
    public static final String NAME_NOT_CLEAR = "MyShare_not_clear";

    /**
     * 第一种方式（固定Sharedpreferences名称）
     * 保存数据
     *
     * @param mContext
     * @param key
     * @param value
     */
    public static void save(Context mContext, String key, Object value) {
        initial(mContext);
        if (value instanceof String) {
            sp.edit().putString(key, (String) value).commit();
        } else if (value instanceof Boolean) {
            sp.edit().putBoolean(key, (Boolean) value).commit();
        } else if (value instanceof Integer) {
            sp.edit().putInt(key, (Integer) value).commit();
        } else if (value instanceof Float) {
            sp.edit().putFloat(key, (Float) value).commit();
        } else if (value instanceof Long) {
            sp.edit().putLong(key, (Long) value).commit();
        }
    }

    /**
     * 第一种方式（固定Sharedpreferences名称）
     * 获取数据
     *
     * @param mContext
     * @param key
     * @return
     */
    public static int getInteger(Context mContext, String key) {
        initial(mContext);
        return sp.getInt(key, 0);
    }

    public static Float getFloat(Context mContext, String key) {
        initial(mContext);
        return sp.getFloat(key, 0F);
    }

    public static Long getLong(Context mContext, String key) {
        initial(mContext);
        return sp.getLong(key, 0L);
    }

    public static Boolean getBoolean(Context mContext, String key) {
        initial(mContext);
        return sp.getBoolean(key, false);
    }

    public static String getString(Context mContext, String key) {
        initial(mContext);
        return sp.getString(key, "");
    }

    private static void initial(Context mContext) {
        sp = mContext.getSharedPreferences(NAME_CLEAR, 0);
    }


    /**
     * 第二种方式（自定义Sharedpreferences名称）
     * 保存数据
     *
     * @param mContext 传回comtext
     * @param fileName 存储的文件名
     * @param key      所要存储的key值
     * @param value    所要存储的key值得value
     */
    public static void save2(Context mContext, String fileName, String key,
                             Object value) {
        initial2(mContext, fileName);
        if (value instanceof String) {
            sp.edit().putString(key, (String) value).commit();
        } else if (value instanceof Boolean) {
            sp.edit().putBoolean(key, (Boolean) value).commit();
        } else if (value instanceof Integer) {
            sp.edit().putInt(key, (Integer) value).commit();
        } else if (value instanceof Float) {
            sp.edit().putFloat(key, (Float) value).commit();
        } else if (value instanceof Long) {
            sp.edit().putLong(key, (Long) value).commit();
        }
    }

    /**
     * 第一种方式（固定Sharedpreferences名称）
     * 获取数据
     *
     * @param mContext
     * @param fileName
     * @param key
     * @return
     */
    public static int getInteger2(Context mContext, String fileName, String key) {
        initial2(mContext, fileName);
        return sp.getInt(key, 0);
    }

    public static Float getFloat2(Context mContext, String fileName, String key) {
        initial2(mContext, fileName);
        return sp.getFloat(key, 0F);
    }

    public static Long getLong2(Context mContext, String fileName, String key) {
        initial2(mContext, fileName);
        return sp.getLong(key, 0L);
    }

    public static Boolean getBoolean2(Context mContext, String fileName,
                                      String key) {
        initial2(mContext, fileName);
        return sp.getBoolean(key, false);
    }

    public static String getString2(Context mContext, String fileName,
                                    String key) {
        initial2(mContext, fileName);
        return sp.getString(key, "");
    }

    public static void initial2(Context mContext, String fileName) {
        sp = mContext.getSharedPreferences(fileName, 0);
    }

    /**
     * 第一种情况下清空某个文件下的所有的数据
     *
     * @param mContext
     */
    public static void removeFile(Context mContext) {
        initial(mContext);
        Editor editor = sp.edit();
        editor.clear();
        editor.commit();
    }

    /**
     * 第二种情况下清空某个文件下的所有的数据
     *
     * @param mContext
     * @param fileName
     */
    public static void removeFile2(Context mContext, String fileName) {
        initial2(mContext, fileName);
        Editor editor = sp.edit();
        editor.clear();
        editor.commit();
    }

    /**
     * desc:保存对象
     *
     * @param context
     * @param key
     * @param obj     要保存的对象，只能保存实现了serializable的对象
     *                modified:
     */
    public static void saveObject(Context context, String key, Object obj) {
        String jsonString = JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue);
        MyLog.d("MySharedPreferences", "saveObject jsonString : " + jsonString);
        save(context, key, jsonString);
    }

    /**
     * desc:获取保存的Object对象
     *
     * @param context
     * @param key
     * @return modified:
     */
    public static Object getObject(Context context, String key, Class<?> tranCls) {
        String jsonString = getString(context, key);
        MyLog.d("MySharedPreferences", "getObject jsonString : " + jsonString);
        return JSON.parseObject(jsonString, tranCls);
    }
}